library(waffle)
Error in library(waffle) : there is no package called ‘waffle’
df <- readr::read_csv("~/Github/product_journey/data/my_product_journey.csv") %>%
dplyr::mutate(temp = 0)
Rows: 16 Columns: 8
── Column specification ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr (6): organization, product, description, type, client, link
dbl (2): id, year
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
df
# Custom colours
drsimonj_colors <- c(
`lite green` = "#9FC2B9",
`mid green` = "#1E6E6E",
`dark green` = "#153331",
`orange` = "#E74F2C",
`red` = "#A62014")
drsimonj_cols <- function(...) {
cols <- c(...)
if (is.null(cols))
return (drsimonj_colors)
drsimonj_colors[cols]
}
drsimonj_palettes <- list(
`main` = drsimonj_cols("lite green", "mid green", "dark green", "orange", "red"))
drsimonj_pal <- function(palette = "main", reverse = FALSE, ...) {
pal <- drsimonj_palettes[[palette]]
if (reverse) pal <- rev(pal)
colorRampPalette(pal, ...)
}
scale_color_drsimonj <- function(palette = "main", discrete = TRUE, reverse = FALSE, ...) {
pal <- drsimonj_pal(palette = palette, reverse = reverse)
if (discrete) {
discrete_scale("colour", paste0("drsimonj_", palette), palette = pal, ...)
} else {
scale_color_gradientn(colours = pal(256), ...)
}
}
scale_fill_drsimonj <- function(palette = "main", discrete = TRUE, reverse = FALSE, ...) {
pal <- drsimonj_pal(palette = palette, reverse = reverse)
if (discrete) {
discrete_scale("fill", paste0("drsimonj_", palette), palette = pal, ...)
} else {
scale_fill_gradientn(colours = pal(256), ...)
}
}
df %>%
ggplot() +
aes(x = year) +
geom_histogram(bins = 30L, fill = "#153331") +
theme_minimal() +
scale_y_continuous(breaks = scales::pretty_breaks())

df %>%
ggplot() +
aes(x = year, y = temp, shape = group) +
geom_point(position = position_jitter(w = 1, h = 0.01), size = 3) +
scale_color_hue(direction = 1) +
theme_minimal() +
theme(legend.position = "bottom",
legend.title = element_blank(),
axis.title.y = element_blank()) +
labs(x = "Product Release Year") +
scale_x_continuous(breaks = scales::pretty_breaks())

df %>%
ggplot() +
aes(x = year, y = temp, colour = group) +
geom_point(position = position_jitter(w = 1, h = 0.01), size = 3) +
scale_color_drsimonj() +
theme_minimal() +
theme(legend.position = "bottom",
legend.title = element_blank(),
axis.title.y = element_blank()) +
labs(x = "Product Release Year") +
scale_x_continuous(breaks = scales::pretty_breaks())

df %>%
ggplot() +
aes(x = year, fill = group) +
geom_histogram(bins = 30L) +
scale_fill_drsimonj() +
theme_minimal() +
labs(x = "Product Release Year",
y = "Number of Products") +
theme(legend.position = "bottom",
legend.title=element_blank())

df %>%
ggplot() +
aes(x = year, y = temp, colour = group, label = organization, label2 = product, label3 = description, label4 = link) +
geom_point(position = position_jitter(w = 1, h = 0.01), size = 3) +
coord_fixed(ratio = 160) +
scale_color_drsimonj() +
theme_minimal() +
theme(legend.position = "bottom",
legend.title = element_blank(),
axis.title.y = element_blank()) +
labs(x = "Product Release Year") +
scale_x_continuous(breaks = scales::pretty_breaks())

p1 <- df %>%
ggplot() +
aes(x = year, y = temp, colour = type, label = organization, label2 = product, label3 = description) +
geom_point(position = position_jitter(w = 1, h = 0.01), size = 3) +
scale_color_drsimonj() +
theme_minimal() +
theme(axis.title.y = element_blank(),
axis.text.y = element_blank(),
axis.ticks.y = element_blank()) +
labs(x = "Product Release Year") +
scale_x_continuous(breaks = scales::pretty_breaks())
plotly::ggplotly(p1,
width = 1000,
heigh = 300,
tooltip = c("year", "organization", "product", "description"))
p2 <- df %>%
ggplot() +
aes(x = year, y = temp, label = organization, label2 = product, label3 = type) +
geom_point(position = position_jitter(w = 1, h = 0.01), size = 3, colour = "#153331") +
scale_color_drsimonj() +
theme_minimal() +
theme(axis.title.y = element_blank(),
axis.text.y = element_blank(),
axis.ticks.y = element_blank()) +
labs(x = "Product Release Year") +
scale_x_continuous(breaks = scales::pretty_breaks())
plotly::ggplotly(p2,
width = 1000,
heigh = 300,
tooltip = c("year", "organization", "product", "type"))
# Vector
x <- c(G1 = 30, G2 = 25, G3 = 20, G4 = 5)
# Waffle chart
waffle(x, rows = 8)

df %>%
dplyr::group_by(type) %>%
dplyr::tally() %>%
dplyr::ungroup()
# Vector
a <- c(Application = 5, `Digital Twin` = 3, Extension = 4, `Mobile App` = 1, SaaS = 3)
# Waffle chart
waffle(a, rows = 4)

df %>%
ggplot(aes(x, y, fill = type)) +
geom_waffle()
Error in FUN(X[[i]], ...) : object 'x' not found

df %>%
dplyr::group_by(type) %>%
dplyr::tally() %>%
dplyr::ungroup() %>%
ggplot2::ggplot() +
aes(x = 2, y = n, fill = type) +
geom_bar(stat = "identity") +
coord_polar("y", start = 200) +
theme_void() +
theme(legend.position = "bottom",
legend.title = element_blank()) +
scale_fill_drsimonj() +
xlim(0.7, 2.5)

ggplot(data = rdown.os,
aes(x = 2, y = percentage, fill = os))+
geom_bar(stat = "identity")+
coord_polar("y", start = 200) +
geom_text(aes(y = lab.pos, label = paste(percentage,"%", sep = "")), col = "white") +
theme_void() +
scale_fill_drsimonj() +
xlim(.2,2.5)
Error in ggplot(data = rdown.os, aes(x = 2, y = percentage, fill = os)) :
object 'rdown.os' not found
LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKYGBge3J9CmxpYnJhcnkocmVhZHIpCmxpYnJhcnkoZHBseXIpCmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShwbG90bHkpCmxpYnJhcnkoc2NhbGVzKQpsaWJyYXJ5KGdnd2FmZmxlKQpsaWJyYXJ5KHdhZmZsZSkKYGBgCgpgYGB7cn0KZGYgPC0gcmVhZHI6OnJlYWRfY3N2KCJ+L0dpdGh1Yi9wcm9kdWN0X2pvdXJuZXkvZGF0YS9teV9wcm9kdWN0X2pvdXJuZXkuY3N2IikgJT4lCiAgZHBseXI6Om11dGF0ZSh0ZW1wID0gMCkKZGYKYGBgCgoKYGBge3J9CiMgQ3VzdG9tIGNvbG91cnMKZHJzaW1vbmpfY29sb3JzIDwtIGMoCiAgYGxpdGUgZ3JlZW5gID0gIiM5RkMyQjkiLAogIGBtaWQgZ3JlZW5gID0gIiMxRTZFNkUiLAogIGBkYXJrIGdyZWVuYCA9ICIjMTUzMzMxIiwKICBgb3JhbmdlYCA9ICIjRTc0RjJDIiwKICBgcmVkYCA9ICIjQTYyMDE0IikKCgpkcnNpbW9ual9jb2xzIDwtIGZ1bmN0aW9uKC4uLikgewogIGNvbHMgPC0gYyguLi4pCgogIGlmIChpcy5udWxsKGNvbHMpKQogICAgcmV0dXJuIChkcnNpbW9ual9jb2xvcnMpCgogIGRyc2ltb25qX2NvbG9yc1tjb2xzXQp9CgoKZHJzaW1vbmpfcGFsZXR0ZXMgPC0gbGlzdCgKICBgbWFpbmAgID0gZHJzaW1vbmpfY29scygibGl0ZSBncmVlbiIsICJtaWQgZ3JlZW4iLCAiZGFyayBncmVlbiIsICJvcmFuZ2UiLCAicmVkIikpCgoKZHJzaW1vbmpfcGFsIDwtIGZ1bmN0aW9uKHBhbGV0dGUgPSAibWFpbiIsIHJldmVyc2UgPSBGQUxTRSwgLi4uKSB7CiAgcGFsIDwtIGRyc2ltb25qX3BhbGV0dGVzW1twYWxldHRlXV0KCiAgaWYgKHJldmVyc2UpIHBhbCA8LSByZXYocGFsKQoKICBjb2xvclJhbXBQYWxldHRlKHBhbCwgLi4uKQp9CgoKc2NhbGVfY29sb3JfZHJzaW1vbmogPC0gZnVuY3Rpb24ocGFsZXR0ZSA9ICJtYWluIiwgZGlzY3JldGUgPSBUUlVFLCByZXZlcnNlID0gRkFMU0UsIC4uLikgewogIHBhbCA8LSBkcnNpbW9ual9wYWwocGFsZXR0ZSA9IHBhbGV0dGUsIHJldmVyc2UgPSByZXZlcnNlKQoKICBpZiAoZGlzY3JldGUpIHsKICAgIGRpc2NyZXRlX3NjYWxlKCJjb2xvdXIiLCBwYXN0ZTAoImRyc2ltb25qXyIsIHBhbGV0dGUpLCBwYWxldHRlID0gcGFsLCAuLi4pCiAgfSBlbHNlIHsKICAgIHNjYWxlX2NvbG9yX2dyYWRpZW50bihjb2xvdXJzID0gcGFsKDI1NiksIC4uLikKICB9Cn0KCgpzY2FsZV9maWxsX2Ryc2ltb25qIDwtIGZ1bmN0aW9uKHBhbGV0dGUgPSAibWFpbiIsIGRpc2NyZXRlID0gVFJVRSwgcmV2ZXJzZSA9IEZBTFNFLCAuLi4pIHsKICBwYWwgPC0gZHJzaW1vbmpfcGFsKHBhbGV0dGUgPSBwYWxldHRlLCByZXZlcnNlID0gcmV2ZXJzZSkKCiAgaWYgKGRpc2NyZXRlKSB7CiAgICBkaXNjcmV0ZV9zY2FsZSgiZmlsbCIsIHBhc3RlMCgiZHJzaW1vbmpfIiwgcGFsZXR0ZSksIHBhbGV0dGUgPSBwYWwsIC4uLikKICB9IGVsc2UgewogICAgc2NhbGVfZmlsbF9ncmFkaWVudG4oY29sb3VycyA9IHBhbCgyNTYpLCAuLi4pCiAgfQp9CmBgYAoKCmBgYHtyfQpkZiAlPiUKICBnZ3Bsb3QoKSArCiAgYWVzKHggPSB5ZWFyKSArCiAgZ2VvbV9oaXN0b2dyYW0oYmlucyA9IDMwTCwgZmlsbCA9ICIjMTUzMzMxIikgKwogIHRoZW1lX21pbmltYWwoKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNjYWxlczo6cHJldHR5X2JyZWFrcygpKQpgYGAKCmBgYHtyfQpkZiAlPiUKICBnZ3Bsb3QoKSArCiAgYWVzKHggPSB5ZWFyLCB5ID0gdGVtcCwgc2hhcGUgPSBncm91cCkgKwogIGdlb21fcG9pbnQocG9zaXRpb24gPSBwb3NpdGlvbl9qaXR0ZXIodyA9IDEsIGggPSAwLjAxKSwgc2l6ZSA9IDMpICsKICBzY2FsZV9jb2xvcl9odWUoZGlyZWN0aW9uID0gMSkgKwogIHRoZW1lX21pbmltYWwoKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIsCiAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfYmxhbmsoKSkgKwogIGxhYnMoeCA9ICJQcm9kdWN0IFJlbGVhc2UgWWVhciIpICsKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2NhbGVzOjpwcmV0dHlfYnJlYWtzKCkpCgoKZGYgJT4lCiAgZ2dwbG90KCkgKwogIGFlcyh4ID0geWVhciwgeSA9IHRlbXAsIGNvbG91ciA9IGdyb3VwKSArCiAgZ2VvbV9wb2ludChwb3NpdGlvbiA9IHBvc2l0aW9uX2ppdHRlcih3ID0gMSwgaCA9IDAuMDEpLCBzaXplID0gMykgKwogIHNjYWxlX2NvbG9yX2Ryc2ltb25qKCkgKwogIHRoZW1lX21pbmltYWwoKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIsCiAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfYmxhbmsoKSkgKwogIGxhYnMoeCA9ICJQcm9kdWN0IFJlbGVhc2UgWWVhciIpICsKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2NhbGVzOjpwcmV0dHlfYnJlYWtzKCkpCgoKZGYgJT4lCiAgZ2dwbG90KCkgKwogIGFlcyh4ID0geWVhciwgZmlsbCA9IGdyb3VwKSArCiAgZ2VvbV9oaXN0b2dyYW0oYmlucyA9IDMwTCkgKwogIHNjYWxlX2ZpbGxfZHJzaW1vbmooKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICBsYWJzKHggPSAiUHJvZHVjdCBSZWxlYXNlIFllYXIiLAogICAgICAgeSA9ICJOdW1iZXIgb2YgUHJvZHVjdHMiKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIsCiAgICAgICAgbGVnZW5kLnRpdGxlPWVsZW1lbnRfYmxhbmsoKSkKYGBgCgoKYGBge3J9CmRmICU+JQogIGdncGxvdCgpICsKICBhZXMoeCA9IHllYXIsIHkgPSB0ZW1wLCBjb2xvdXIgPSBncm91cCwgbGFiZWwgPSBvcmdhbml6YXRpb24sIGxhYmVsMiA9IHByb2R1Y3QsIGxhYmVsMyA9IGRlc2NyaXB0aW9uLCBsYWJlbDQgPSBsaW5rKSArCiAgZ2VvbV9wb2ludChwb3NpdGlvbiA9IHBvc2l0aW9uX2ppdHRlcih3ID0gMSwgaCA9IDAuMDEpLCBzaXplID0gMykgKwogIGNvb3JkX2ZpeGVkKHJhdGlvID0gMTYwKSArCiAgc2NhbGVfY29sb3JfZHJzaW1vbmooKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIiwKICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF9ibGFuaygpKSArCiAgbGFicyh4ID0gIlByb2R1Y3QgUmVsZWFzZSBZZWFyIikgKwogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzY2FsZXM6OnByZXR0eV9icmVha3MoKSkKYGBgCgoKCmBgYHtyfQpwMSA8LSBkZiAlPiUKICBnZ3Bsb3QoKSArCiAgYWVzKHggPSB5ZWFyLCB5ID0gdGVtcCwgY29sb3VyID0gdHlwZSwgbGFiZWwgPSBvcmdhbml6YXRpb24sIGxhYmVsMiA9IHByb2R1Y3QsIGxhYmVsMyA9IGRlc2NyaXB0aW9uKSArCiAgZ2VvbV9wb2ludChwb3NpdGlvbiA9IHBvc2l0aW9uX2ppdHRlcih3ID0gMSwgaCA9IDAuMDEpLCBzaXplID0gMykgKwogIHNjYWxlX2NvbG9yX2Ryc2ltb25qKCkgKwogIHRoZW1lX21pbmltYWwoKSArCiAgdGhlbWUoYXhpcy50aXRsZS55ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGlja3MueSA9IGVsZW1lbnRfYmxhbmsoKSkgKwogIGxhYnMoeCA9ICJQcm9kdWN0IFJlbGVhc2UgWWVhciIpICsKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2NhbGVzOjpwcmV0dHlfYnJlYWtzKCkpCgpwbG90bHk6OmdncGxvdGx5KHAxLAogICAgICAgICAgICAgICAgIHdpZHRoID0gMTAwMCwKICAgICAgICAgICAgICAgICBoZWlnaCA9IDMwMCwKICAgICAgICAgICAgICAgICB0b29sdGlwID0gYygieWVhciIsICJvcmdhbml6YXRpb24iLCAicHJvZHVjdCIsICJkZXNjcmlwdGlvbiIpKQpgYGAKCgpgYGB7cn0KcDIgPC0gZGYgJT4lCiAgZ2dwbG90KCkgKwogIGFlcyh4ID0geWVhciwgeSA9IHRlbXAsIGxhYmVsID0gb3JnYW5pemF0aW9uLCBsYWJlbDIgPSBwcm9kdWN0LCBsYWJlbDMgPSB0eXBlKSArCiAgZ2VvbV9wb2ludChwb3NpdGlvbiA9IHBvc2l0aW9uX2ppdHRlcih3ID0gMSwgaCA9IDAuMDEpLCBzaXplID0gMywgY29sb3VyID0gIiMxNTMzMzEiKSArCiAgc2NhbGVfY29sb3JfZHJzaW1vbmooKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICB0aGVtZShheGlzLnRpdGxlLnkgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50aWNrcy55ID0gZWxlbWVudF9ibGFuaygpKSArCiAgbGFicyh4ID0gIlByb2R1Y3QgUmVsZWFzZSBZZWFyIikgKwogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzY2FsZXM6OnByZXR0eV9icmVha3MoKSkKCnBsb3RseTo6Z2dwbG90bHkocDIsCiAgICAgICAgICAgICAgICAgd2lkdGggPSAxMDAwLAogICAgICAgICAgICAgICAgIGhlaWdoID0gMzAwLAogICAgICAgICAgICAgICAgIHRvb2x0aXAgPSBjKCJ5ZWFyIiwgIm9yZ2FuaXphdGlvbiIsICJwcm9kdWN0IiwgInR5cGUiKSkKYGBgCgoKYGBge3J9CiMgVmVjdG9yCnggPC0gYyhHMSA9IDMwLCBHMiA9IDI1LCBHMyA9IDIwLCBHNCA9IDUpCgojIFdhZmZsZSBjaGFydAp3YWZmbGUoeCwgcm93cyA9IDgpCmBgYAoKCgoKCmBgYHtyfQpkZiAlPiUKICBkcGx5cjo6Z3JvdXBfYnkodHlwZSkgJT4lCiAgZHBseXI6OnRhbGx5KCkgJT4lCiAgZHBseXI6OnVuZ3JvdXAoKQoKIyBWZWN0b3IKYSA8LSBjKEFwcGxpY2F0aW9uID0gNSwgYERpZ2l0YWwgVHdpbmAgPSAzLCBFeHRlbnNpb24gPSA0LCBgTW9iaWxlIEFwcGAgPSAxLCBTYWFTID0gMykKCiMgV2FmZmxlIGNoYXJ0CndhZmZsZShhLCByb3dzID0gNCkKYGBgCgoKYGBge3J9CmdncGxvdChkZiwgYWVzKGZpbGwgPSBncm91cCwgdmFsdWVzID0gdmFsdWUpKSArCiAgZ2VvbV93YWZmbGUobl9yb3dzID0gOCwgc2l6ZSA9IDAuMzMsIGNvbG91ciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX21hbnVhbChuYW1lID0gTlVMTCwKICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCIjQkExODJBIiwgIiNGRjgyODgiLCAiI0ZGREJERCIpLAogICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIkEiLCAiQiIsICJDIikpICsKICBjb29yZF9lcXVhbCgpICsKICB0aGVtZV92b2lkKCkKYGBgCgoKYGBge3J9CmRmICU+JQogIGRwbHlyOjpncm91cF9ieSh0eXBlKSAlPiUKICBkcGx5cjo6dGFsbHkoKSAlPiUKICBkcGx5cjo6dW5ncm91cCgpICU+JQogIGdncGxvdDI6OmdncGxvdCgpICsKICAgYWVzKHggPSAyLCB5ID0gbiwgZmlsbCA9IHR5cGUpICsKICAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIpICsKICAgY29vcmRfcG9sYXIoInkiLCBzdGFydCA9IDIwMCkgKwogICB0aGVtZV92b2lkKCkgKwogICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIiwKICAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF9ibGFuaygpKSArCiAgIHNjYWxlX2ZpbGxfZHJzaW1vbmooKSArCiAgIHhsaW0oMC43LCAyLjUpCmBgYAoKYGBge3J9CmdncGxvdChkYXRhID0gcmRvd24ub3MsIAogICAgICAgYWVzKHggPSAyLCB5ID0gcGVyY2VudGFnZSwgZmlsbCA9IG9zKSkrCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIpKwogIGNvb3JkX3BvbGFyKCJ5Iiwgc3RhcnQgPSAyMDApICsKICBnZW9tX3RleHQoYWVzKHkgPSBsYWIucG9zLCBsYWJlbCA9IHBhc3RlKHBlcmNlbnRhZ2UsIiUiLCBzZXAgPSAiIikpLCBjb2wgPSAid2hpdGUiKSArCiAgdGhlbWVfdm9pZCgpICsKICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIkRhcmsyIikrCiAgeGxpbSguMiwyLjUpCmBgYAoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg==